package fiscal.entities.tables;

import java.util.ArrayList;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;

import mercadologico.entities.tables.Embalagem;
import mercadologico.entities.tables.GrupoGenericoProduto;
import mercadologico.entities.tables.Medida;
import mercadologico.entities.tables.MedidaEmbalagem;

import exceptions.PersistenceExceptionMessage;
import fiscal.dao.PersistenceMoldeProduto;
import generic.interfaces.GenericPersistence;
import generic.interfaces.IDEntity;

@Entity
public class MoldeProduto implements IDEntity<Integer>, GenericPersistence<PersistenceMoldeProduto, Integer, MoldeProduto> {

	public static PersistenceMoldeProduto persist = new PersistenceMoldeProduto();
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	private String descricao;
	
	/***************************************/
	@OneToOne
	private Classificacao classificacao;
	@OneToOne
	private MedidaEmbalagem medidaEmbalagem;
	@OneToOne
	private Medida unidadeVenda;
	@OneToOne
	private Medida medidaCompra;
	@OneToOne
	private Embalagem embalagem;
	@OneToOne
	private GrupoGenericoProduto grupoProdutoGenerico;
	/***************************************/
	
	private Double fatorMedida;
	
	/***************************************/
	@OneToOne
	private PisCofins PCEntrada;
	@OneToOne
	private PisCofins PCSaida;
	@OneToOne
	private TipoInventario tipoInventario;
	@OneToOne
	private TipoProduto tipoProduto;
	
	private Boolean isentoCSLLIRPJ;
	/***************************************/
	
	private Integer prazoMinimo;
	private Double percentReajuste;
	private Integer recebimentoMaximo;
	private Double estoqueMaximo;
	private Double estoqueMinimo;
	private Double margemLucro;
	private Double margemOperacional;
	
	private Boolean revenda;
	private Boolean consumo;
	private Boolean insumo;
	private Boolean ativo;
	private Boolean servico;
	
	private Boolean fracionada;
	private Boolean importado;
	private Boolean cotacao;
	private Boolean produtoSimilar;
	
	
	public void setId(Integer id) {
		this.id = id;
	}
	
	public Integer getId() {
		return this.id;
	}
	public Classificacao getClassificacao() {
		return classificacao;
	}
	public void setClassificacao(Classificacao classificacao) {
		this.classificacao = classificacao;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public MedidaEmbalagem getMedidaEmbalagem() {
		return medidaEmbalagem;
	}
	public void setMedidaEmbalagem(MedidaEmbalagem medidaEmbalagem) {
		this.medidaEmbalagem = medidaEmbalagem;
	}
	public Medida getUnidadeVenda() {
		return unidadeVenda;
	}
	public void setUnidadeVenda(Medida unidadeVenda) {
		this.unidadeVenda = unidadeVenda;
	}
	public Double getFatorMedida() {
		return fatorMedida;
	}
	public void setFatorMedida(Double fatorMedida) {
		this.fatorMedida = fatorMedida;
	}
	public Medida getMedidaCompra() {
		return medidaCompra;
	}
	public void setMedidaCompra(Medida medidaCompra) {
		this.medidaCompra= medidaCompra;
	}
	public Embalagem getEmbalagem() {
		return embalagem;
	}
	public void setEmbalagem(Embalagem embalagem) {
		this.embalagem = embalagem;
	}
	public GrupoGenericoProduto getGrupoProdutoGenerico() {
		return grupoProdutoGenerico;
	}
	public void setGrupoProdutoGenerico(GrupoGenericoProduto grupoProdutoGenerico) {
		this.grupoProdutoGenerico = grupoProdutoGenerico;
	}
	public Boolean getImportado() {
		return importado;
	}
	public void setImportado(Boolean importado) {
		this.importado = importado;
	}
	public Integer getPrazoMinimo() {
		return prazoMinimo;
	}
	public void setPrazoMinimo(Integer prazoMinimo) {
		this.prazoMinimo = prazoMinimo;
	}
	public Double getPercentReajuste() {
		return percentReajuste;
	}
	public void setPercentReajuste(Double percentReajuste) {
		this.percentReajuste = percentReajuste;
	}
	public Integer getRecebimentoMaximo() {
		return recebimentoMaximo;
	}
	public void setRecebimentoMaximo(Integer recebimentoMaximo) {
		this.recebimentoMaximo = recebimentoMaximo;
	}
	public Double getEstoqueMaximo() {
		return estoqueMaximo;
	}
	public void setEstoqueMaximo(Double estoqueMaximo) {
		this.estoqueMaximo = estoqueMaximo;
	}
	public Double getEstoqueMinimo() {
		return estoqueMinimo;
	}
	public void setEstoqueMinimo(Double estoqueMinimo) {
		this.estoqueMinimo = estoqueMinimo;
	}
	public Double getMargemLucro() {
		return margemLucro;
	}
	public void setMargemLucro(Double margemLucro) {
		this.margemLucro = margemLucro;
	}
	public Double getMargemOperacional() {
		return margemOperacional;
	}
	public void setMargemOperacional(Double margemOperacional) {
		this.margemOperacional = margemOperacional;
	}
	public Boolean getFracionada() {
		return fracionada;
	}
	public void setFracionada(Boolean fracionada) {
		this.fracionada = fracionada;
	}
	public Boolean getCotacao() {
		return cotacao;
	}
	public void setCotacao(Boolean cotacao) {
		this.cotacao = cotacao;
	}
	public Boolean getProdutoSimilar() {
		return produtoSimilar;
	}
	public void setProdutoSimilar(Boolean produtoSimilar) {
		this.produtoSimilar = produtoSimilar;
	}
	public Boolean getRevenda() {
		return revenda;
	}
	public void setRevenda(Boolean revenda) {
		this.revenda = revenda;
	}
	public Boolean getConsumo() {
		return consumo;
	}
	public void setConsumo(Boolean consumo) {
		this.consumo = consumo;
	}
	public Boolean getInsumo() {
		return insumo;
	}
	public void setInsumo(Boolean insumo) {
		this.insumo = insumo;
	}
	public Boolean getAtivo() {
		return ativo;
	}
	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}
	public Boolean getServico() {
		return servico;
	}
	public void setServico(Boolean servico) {
		this.servico = servico;
	}
	public PisCofins getPCEntrada() {
		return PCEntrada;
	}
	public void setPCEntrada(PisCofins pCEntrada) {
		PCEntrada = pCEntrada;
	}
	public PisCofins getPCSaida() {
		return PCSaida;
	}
	public void setPCSaida(PisCofins pCSaida) {
		PCSaida = pCSaida;
	}
	public TipoInventario getTipoInventario() {
		return tipoInventario;
	}
	public void setTipoInventario(TipoInventario tipoInventario) {
		this.tipoInventario = tipoInventario;
	}
	public TipoProduto getTipoProduto() {
		return tipoProduto;
	}
	public void setTipoProduto(TipoProduto tipoProduto) {
		this.tipoProduto = tipoProduto;
	}
	
	public Boolean getIsentoCSLLIRPJ() {
		return isentoCSLLIRPJ;
	}
	public void setIsentoCSLLIRPJ(Boolean isentoCSLLIRPJ) {
		this.isentoCSLLIRPJ = isentoCSLLIRPJ;
	}
	
	public String toString() {
		return getDescricao();
	}
	
	
	public PersistenceMoldeProduto DAOInstance() {
		if (persist == null) {
			persist = new PersistenceMoldeProduto();
		}
		return persist;
	}
	
	public MoldeProduto find(Integer id) throws PersistenceExceptionMessage {
		return DAOInstance().find(id);
	}
	
	public void persist() throws PersistenceExceptionMessage {
		DAOInstance().persist(this);
	}
	
	public void remove() throws PersistenceExceptionMessage {
		DAOInstance().remove(this);
	}
	
	public MoldeProduto merge() throws PersistenceExceptionMessage {
		return DAOInstance().merge(this);
	}
	
	public ArrayList<MoldeProduto> findAll() throws PersistenceExceptionMessage {
		return (ArrayList<MoldeProduto>) DAOInstance().findAll();
	}
	/*public boolean equalsPCEntrada() {
		if (getClassificacao() != null && getClassificacao().getPCEntrada() != null && getPCEntrada() != null && getClassificacao().getPCEntrada().getId().equals(getPCEntrada().getId()))
			return true;
		return false;
	}
	public boolean equalsPCSaida() {
		if (getClassificacao() != null && getClassificacao().getPCSaida() != null && getPCSaida() != null && getClassificacao().getPCSaida().getId().equals(getPCSaida().getId()))
			return true;
		return false;
	}
	public boolean equalsPCTipoInventario() {
		if (getClassificacao() != null && getClassificacao().getTipoInventario() != null && getTipoInventario() != null && getClassificacao().getTipoInventario().getId().equals(getTipoInventario().getId()))
			return true;
		return false;
	}
	public boolean equalsPCTipoProduto() {
		if (getClassificacao() != null && getClassificacao().getTipoProduto() != null && getTipoProduto() != null && getClassificacao().getTipoProduto().getId().equals(getTipoProduto().getId()))
			return true;
		return false;
	}
	public boolean equalsIsentoPC() {
		if (getClassificacao() != null && getClassificacao().getIsentoRenda() != null && getIsentoCSLLIRPJ() != null && getClassificacao().getIsentoRenda() == getIsentoCSLLIRPJ())
			return true;
		return false;
	}
	public boolean equalsFiscal() {
		if (equalsPCEntrada() || equalsPCSaida() || equalsPCTipoInventario() || equalsPCTipoProduto() || equalsIsentoPC())
			return true;
		return false;
	}*/
	
	
}
